const validate=require('../middleware/validator')
const {
	User
} = require('../model')

// 数据验证,body请求体
const {
	body,
} = require('express-validator');
const md5=require('../util/MD5')

// 注册的验证规则，下面格式的验证为异步
exports.register=validate([
	//1,验证规则,notEmpty()非空
		body('user.username').notEmpty().withMessage('用户名不能为空').custom(async username => {
			const user = await User.findOne({
				username
			})
			if (user) {
				return Promise.reject('用户名已存在')
			}
		}),
		body('user.password').notEmpty().withMessage('密码不能为空'),
		body('user.email').notEmpty().withMessage('邮箱不能为空').isEmail().withMessage('邮箱格式错误')
		.bail().custom(async value => {
			const user = await User.findOne({
				email: value
			})
			if (user) {
				return Promise.reject('邮箱已存在')
			}
		})
		// bail()前面验证通过才会继续往下面走。否这不会。custom自定义验证规则
	
])


// 登录的验证规则  先验证是否为空，再验证邮箱是否存在，再看密码是否正确
// 数组格式的验证，按顺序验证，前面通过才会继续，不通过结束
exports.login=[
	// 1，验证是否为空
	validate([
		body('user.email').notEmpty().withMessage('用户邮箱不能为空'),
		body('user.password').notEmpty().withMessage('用户密码不能为空')
	]),
	// 2,验证邮箱是否存在
	validate([
		body('user.email').custom(async (email,{req})=>{
			// user数据模型设置了密码不可查询,需要设置下让其返回
			// 如果没有加select，默认返回全部字段。如果加了select，返回指定字段+id
			// 单个select('password')，多个用数组
			const user=await User.findOne({ email }).select(['password','username','email','bio'])
			if(!user){
				return Promise.reject('用户不存在')
			}
			// 将数据挂载到req对象上，后续的中间件可以使用。
			req.user=user
			// console.log("请求体中的数据");
			// console.log(req.body);
			// console.log(req.user); //user数据模型设置了密码不可查询
		})
	]),
	/* 
		3，验证密码是否正确.有两个方法，
		一是再通过邮箱去查询数据库获取到数据对象，再与请求体中的password比对
		二是直接在上一步做邮箱验证的时候把请求到的数据挂载到req对象中。注意req和req.body是不一样的
	*/
	validate([
		body('user.password').custom(async (password,{req})=>{
			if(md5(password)!==req.user.password){
				return Promise.reject('密码错误')
			}
		})
	])
]